/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAOs;

import DAOs.exceptions.IllegalOrphanException;
import DAOs.exceptions.NonexistentEntityException;
import DAOs.exceptions.PreexistingEntityException;
import VO.Usuarios;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import VO.Datoscliente;
import VO.Tiposusuarios;
import VO.Empresas;
import java.util.ArrayList;
import java.util.List;
import VO.Contactos;

/**
 *
 * @author Damc
 */
public class UsuariosJpaController {

    public UsuariosJpaController() {
        
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Usuarios usuarios, EntityManager em1) throws PreexistingEntityException, Exception {
        if (usuarios.getEmpresasList() == null) {
            usuarios.setEmpresasList(new ArrayList<Empresas>());
        }
        if (usuarios.getContactosList() == null) {
            usuarios.setContactosList(new ArrayList<Contactos>());
        }
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Datoscliente datoscliente = usuarios.getDatoscliente();
            if (datoscliente != null) {
                datoscliente = em.getReference(datoscliente.getClass(), datoscliente.getIdUsuario());
                usuarios.setDatoscliente(datoscliente);
            }
            Tiposusuarios idTipo = usuarios.getIdTipo();
            if (idTipo != null) {
                idTipo = em.getReference(idTipo.getClass(), idTipo.getIdtiposUsuarios());
                usuarios.setIdTipo(idTipo);
            }
            List<Empresas> attachedEmpresasList = new ArrayList<Empresas>();
            for (Empresas empresasListEmpresasToAttach : usuarios.getEmpresasList()) {
                empresasListEmpresasToAttach = em.getReference(empresasListEmpresasToAttach.getClass(), empresasListEmpresasToAttach.getIdEmpresas());
                attachedEmpresasList.add(empresasListEmpresasToAttach);
            }
            usuarios.setEmpresasList(attachedEmpresasList);
            List<Contactos> attachedContactosList = new ArrayList<Contactos>();
            for (Contactos contactosListContactosToAttach : usuarios.getContactosList()) {
                contactosListContactosToAttach = em.getReference(contactosListContactosToAttach.getClass(), contactosListContactosToAttach.getContactosPK());
                attachedContactosList.add(contactosListContactosToAttach);
            }
            usuarios.setContactosList(attachedContactosList);
            em.persist(usuarios);
            if (datoscliente != null) {
                Usuarios oldUsuariosOfDatoscliente = datoscliente.getUsuarios();
                if (oldUsuariosOfDatoscliente != null) {
                    oldUsuariosOfDatoscliente.setDatoscliente(null);
                    oldUsuariosOfDatoscliente = em.merge(oldUsuariosOfDatoscliente);
                }
                datoscliente.setUsuarios(usuarios);
                datoscliente = em.merge(datoscliente);
            }
            if (idTipo != null) {
                idTipo.getUsuariosList().add(usuarios);
                idTipo = em.merge(idTipo);
            }
            for (Empresas empresasListEmpresas : usuarios.getEmpresasList()) {
                Usuarios oldIdUsuarioOfEmpresasListEmpresas = empresasListEmpresas.getIdUsuario();
                empresasListEmpresas.setIdUsuario(usuarios);
                empresasListEmpresas = em.merge(empresasListEmpresas);
                if (oldIdUsuarioOfEmpresasListEmpresas != null) {
                    oldIdUsuarioOfEmpresasListEmpresas.getEmpresasList().remove(empresasListEmpresas);
                    oldIdUsuarioOfEmpresasListEmpresas = em.merge(oldIdUsuarioOfEmpresasListEmpresas);
                }
            }
            for (Contactos contactosListContactos : usuarios.getContactosList()) {
                Usuarios oldUsuariosOfContactosListContactos = contactosListContactos.getUsuarios();
                contactosListContactos.setUsuarios(usuarios);
                contactosListContactos = em.merge(contactosListContactos);
                if (oldUsuariosOfContactosListContactos != null) {
                    oldUsuariosOfContactosListContactos.getContactosList().remove(contactosListContactos);
                    oldUsuariosOfContactosListContactos = em.merge(oldUsuariosOfContactosListContactos);
                }
            }
//            em.getTransaction().commit();
        } catch (Exception ex) {
            throw ex;
        } 
    }

    public void edit(Usuarios usuarios,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Usuarios persistentUsuarios = em.find(Usuarios.class, usuarios.getIdUsuarios());
            Datoscliente datosclienteOld = persistentUsuarios.getDatoscliente();
            Datoscliente datosclienteNew = usuarios.getDatoscliente();
            Tiposusuarios idTipoOld = persistentUsuarios.getIdTipo();
            Tiposusuarios idTipoNew = usuarios.getIdTipo();
            List<Empresas> empresasListOld = persistentUsuarios.getEmpresasList();
            List<Empresas> empresasListNew = usuarios.getEmpresasList();
            List<Contactos> contactosListOld = persistentUsuarios.getContactosList();
            List<Contactos> contactosListNew = usuarios.getContactosList();
            List<String> illegalOrphanMessages = null;
            if (datosclienteOld != null && !datosclienteOld.equals(datosclienteNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Datoscliente " + datosclienteOld + " since its usuarios field is not nullable.");
            }
            /*for (Empresas empresasListOldEmpresas : empresasListOld) {
                if (!empresasListNew.contains(empresasListOldEmpresas)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Empresas " + empresasListOldEmpresas + " since its idUsuario field is not nullable.");
                }
            }//*/
            /*for (Contactos contactosListOldContactos : contactosListOld) {
                if (!contactosListNew.contains(contactosListOldContactos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Contactos " + contactosListOldContactos + " since its usuarios field is not nullable.");
                }
            }//*/
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (datosclienteNew != null) {
                datosclienteNew = em.getReference(datosclienteNew.getClass(), datosclienteNew.getIdUsuario());
                usuarios.setDatoscliente(datosclienteNew);
            }
            if (idTipoNew != null) {
                idTipoNew = em.getReference(idTipoNew.getClass(), idTipoNew.getIdtiposUsuarios());
                usuarios.setIdTipo(idTipoNew);
            }
            List<Empresas> attachedEmpresasListNew = new ArrayList<Empresas>();
            /*for (Empresas empresasListNewEmpresasToAttach : empresasListNew) {
                empresasListNewEmpresasToAttach = em.getReference(empresasListNewEmpresasToAttach.getClass(), empresasListNewEmpresasToAttach.getIdEmpresas());
                attachedEmpresasListNew.add(empresasListNewEmpresasToAttach);
            }//*/
            empresasListNew = attachedEmpresasListNew;
            usuarios.setEmpresasList(empresasListNew);
            List<Contactos> attachedContactosListNew = new ArrayList<Contactos>();
            /*for (Contactos contactosListNewContactosToAttach : contactosListNew) {
                contactosListNewContactosToAttach = em.getReference(contactosListNewContactosToAttach.getClass(), contactosListNewContactosToAttach.getContactosPK());
                attachedContactosListNew.add(contactosListNewContactosToAttach);
            }//*/
            contactosListNew = attachedContactosListNew;
            usuarios.setContactosList(contactosListNew);
            usuarios = em.merge(usuarios);
            if (datosclienteNew != null && !datosclienteNew.equals(datosclienteOld)) {
                Usuarios oldUsuariosOfDatoscliente = datosclienteNew.getUsuarios();
                if (oldUsuariosOfDatoscliente != null) {
                    oldUsuariosOfDatoscliente.setDatoscliente(null);
                    oldUsuariosOfDatoscliente = em.merge(oldUsuariosOfDatoscliente);
                }
                datosclienteNew.setUsuarios(usuarios);
                datosclienteNew = em.merge(datosclienteNew);
            }
            if (idTipoOld != null && !idTipoOld.equals(idTipoNew)) {
                idTipoOld.getUsuariosList().remove(usuarios);
                idTipoOld = em.merge(idTipoOld);
            }
            if (idTipoNew != null && !idTipoNew.equals(idTipoOld)) {
                idTipoNew.getUsuariosList().add(usuarios);
                idTipoNew = em.merge(idTipoNew);
            }
            for (Empresas empresasListNewEmpresas : empresasListNew) {
                if (!empresasListOld.contains(empresasListNewEmpresas)) {
                    Usuarios oldIdUsuarioOfEmpresasListNewEmpresas = empresasListNewEmpresas.getIdUsuario();
                    empresasListNewEmpresas.setIdUsuario(usuarios);
                    empresasListNewEmpresas = em.merge(empresasListNewEmpresas);
                    if (oldIdUsuarioOfEmpresasListNewEmpresas != null && !oldIdUsuarioOfEmpresasListNewEmpresas.equals(usuarios)) {
                        oldIdUsuarioOfEmpresasListNewEmpresas.getEmpresasList().remove(empresasListNewEmpresas);
                        oldIdUsuarioOfEmpresasListNewEmpresas = em.merge(oldIdUsuarioOfEmpresasListNewEmpresas);
                    }
                }
            }
            for (Contactos contactosListNewContactos : contactosListNew) {
                if (!contactosListOld.contains(contactosListNewContactos)) {
                    Usuarios oldUsuariosOfContactosListNewContactos = contactosListNewContactos.getUsuarios();
                    contactosListNewContactos.setUsuarios(usuarios);
                    contactosListNewContactos = em.merge(contactosListNewContactos);
                    if (oldUsuariosOfContactosListNewContactos != null && !oldUsuariosOfContactosListNewContactos.equals(usuarios)) {
                        oldUsuariosOfContactosListNewContactos.getContactosList().remove(contactosListNewContactos);
                        oldUsuariosOfContactosListNewContactos = em.merge(oldUsuariosOfContactosListNewContactos);
                    }
                }
            }
            //em.getTransaction().commit();
        } catch (Exception ex) {
            throw ex;
        } 
    }

    public void destroy(String id,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Usuarios usuarios;
            try {
                usuarios = em.getReference(Usuarios.class, id);
                usuarios.getIdUsuarios();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The usuarios with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Datoscliente datosclienteOrphanCheck = usuarios.getDatoscliente();
            if (datosclienteOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Datoscliente " + datosclienteOrphanCheck + " in its datoscliente field has a non-nullable usuarios field.");
            }
            List<Empresas> empresasListOrphanCheck = usuarios.getEmpresasList();
            for (Empresas empresasListOrphanCheckEmpresas : empresasListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Empresas " + empresasListOrphanCheckEmpresas + " in its empresasList field has a non-nullable idUsuario field.");
            }
            List<Contactos> contactosListOrphanCheck = usuarios.getContactosList();
            for (Contactos contactosListOrphanCheckContactos : contactosListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Contactos " + contactosListOrphanCheckContactos + " in its contactosList field has a non-nullable usuarios field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tiposusuarios idTipo = usuarios.getIdTipo();
            if (idTipo != null) {
                idTipo.getUsuariosList().remove(usuarios);
                idTipo = em.merge(idTipo);
            }
            em.remove(usuarios);
            //em.getTransaction().commit();
        } catch(Exception e){
        throw  e;
        }
    }

    public List<Usuarios> findUsuariosEntities(EntityManager em1) throws Exception {
        return findUsuariosEntities(true, -1, -1,em1);
    }

    public List<Usuarios> findUsuariosEntities(int maxResults, int firstResult,EntityManager em1) throws Exception {
        return findUsuariosEntities(false, maxResults, firstResult,em1);
    }

    private List<Usuarios> findUsuariosEntities(boolean all, int maxResults, int firstResult,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select object(o) from Usuarios as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        }catch(Exception e){
        throw  e;
        }
    }

    public Usuarios findUsuarios(String id,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            return em.find(Usuarios.class, id);
        } catch(Exception e){
        throw  e;
        }
    }

    public int getUsuariosCount(EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select count(o) from Usuarios as o");
            return ((Long) q.getSingleResult()).intValue();
        } catch (Exception e){

        throw e;
        }

    }

}
